package com.mofang.ticketing.common.redis.distributedLock;

import java.util.concurrent.TimeUnit;

/**
 * 分布式锁
 *
 * @author LGC
 */
public interface DistributedLocker {

    long TIME_OUT = 5;

    /**
     * 获取redission锁  (默认上锁TIME_OUT 分钟)
     *
     * @param resourceName 上锁资源 key
     * @param worker       处理事件
     * @return T
     */
    <T> T lock(String resourceName, AcquireLockWorker<T> worker) throws Throwable;

    /**
     * 获取redission锁
     *
     * @param resourceName 上锁资源 key
     * @param worker       处理事件
     * @param timeOut      上锁时间
     * @param timeUnit     时间单位
     * @return T
     */
    <T> T lock(String resourceName, AcquireLockWorker<T> worker, long timeOut, TimeUnit timeUnit) throws Throwable;

    /**
     * 获取redission锁
     *
     * @param resourceName 上锁资源 key
     * @param worker       处理事件
     * @param ctyTime      加锁等待时间
     * @param timeOut      上锁时间
     * @param timeUnit     时间单位
     * @return T
     */
    <T> T lock(String resourceName, AcquireLockWorker<T> worker, long ctyTime, long timeOut, TimeUnit timeUnit) throws Throwable;
}